package com.biao.threads_test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * Callable 和 Future 线程可以获取到返回结果 底层基于LockSupport
 */
public class Test03_Callable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "返回结果是1...");
        Thread.sleep(3000);
        return 1;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Test03_Callable test03Callable = new Test03_Callable();
        FutureTask<Integer> futureTask = new FutureTask<>(test03Callable);  // 第1步 重写了 call() 方法的类对象放入 FutureTask
        new Thread(futureTask).start();     // 第2步 FutureTask 对象放在 Thread 启动
        // 主要靠这行代码，调用.get() 获取子线程结果来把主线程阻塞
        Integer integer = futureTask.get();     // 获取 FutureTask 执行的结果
        // main 线程获取变量 integer 的结果，必须要等 Callable 子线程执行结束，才能获取到执行的结果
        // 等于变成了单线程，必须要等拿到 call() 方法执行结束，拿到返回结果才能往下执行
        System.out.println(Thread.currentThread().getName() + "---------------" + integer);

        /*
            Callable 的同步原理就是这两个JUC里面的api：
            LockSupport.park();
            LockSupport.unpark();
            一个休眠一个唤醒，同理，让主线程先休眠，等拿到子线程执行结果，再把主线程唤醒
         */
    }
}
